# @Time : 2024-10-22 17:49
# @Author : Fioman 
# @Phone : 13149920693
"""
exec(object[,globals[,locals]])
object: 要执行的代码,可以是字符串形式的python代码,也可以编译后的代码对象(字节码对象)
globals: 用于指定代码执行的全局作用域
locals: 用于指定代码执行的局部作用域
"""
# region 1. exec() 动态执行字符串代码示例
code = """
def greet(name):
    print('Hello ' + name)
greet('John')
"""
exec(code)
# endregion

# region 2. exec() 指定作用域内执行代码
globalScope = {}
exec("x=5", globalScope)
print(globalScope['x'])  # 就是这个变量x=5 赋值到了globalScope这个变量中
# endregion

# region 3. exec() 配合compile使用
# compile 的功能就是将字符串形式的代码编译成Python的代码对象,代码对象可以被exec()和eval()
# 执行的Python内部结构
# filename: 代码来源的文件名,一般填'<string>'即可,主要用于错误提示
# compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
# mode: "exec" "eval" "single"
code = """
x = 10
y = 20
result = x + y
print(result)
"""
exec(code)  # 这里每次都要编译

compiledCode = compile(code, '<string>', 'exec')
exec(compiledCode)  # 这里可以重复调用,重复调用的时候不用每次都编译
# endregion

# region 4. eval() 只执行表达式,并计算结果返回.而exec()执行任意代码,不返回值
# eval() 用于动态执行表达式,并返回表达式的值.只能执行单个表达式,不能执行语句(赋值语句,循环语句等)
# eval(expression,globals=None,locals=None)
expr = "2 + 3 * 5"
result = eval(expr)
print(result)

compiledCode = compile(expr, '<string>', 'eval')
print(eval(compiledCode))

x = 10
expr = " x * 2 "
result = eval(expr)
print(result)

expr = "a + b"
globalVars = {"a": 5, "b": 3}
localVals = {"a": 10, "b": 10}
result = eval(expr, globalVars)  # 使用全局变量
print(result)

# endregion
